package concoursbelote;

import java.util.Random;
import java.util.Scanner;

/**
 * 
 * @author Guillaume
 *
 */
public class Administration 
{
	//*********************************************************
	//			ATTRIBUTS
	//*********************************************************
	public static Bar currentBar = Main.repertoireBar.get(Main.indexBar);
	public static Double prixSupplementaire = new Double(0);
	
	public static String[][] commandePassee = new String[][] { {"eau", "non"}, {"coca", "non"}, {"orangina", "non"}, {"ice-tea", "non"}, {"bière", "non"}, {"whisky", "non"}, {"vodka", "non"}, {"martini", "non"}, {"rosé", "non"}, {"rouge", "non"}, {"blanc", "non"}, {"champagne", "non"} };
	
	//*********************************************************
	//			METHODS
	//*********************************************************
	
	/**
	 * Permet l'administration générale du bar
	 * @author Guillaume
	 */
	public static void administrationGenerale()
	{
		if(Administration.currentBar.serveur.isEmpty())
		{
			Administration.sansServeur();
		}
		else if(Administration.currentBar.clients.isEmpty())
		{
			Administration.sansClient();
		}
		else if(!Administration.currentBar.clients.isEmpty())
		{
			Erreur.unServeurHommeMinimum();
			Administration.avecClient();
		}
	}
	
	/**
	 * Permet de gérer un bar si il n'y a aucun serveur et donc aucun client
	 * @author Guillaume
	 */
	public static void sansServeur()
	{
		Random rnd = new Random();
		int random = rnd.nextInt(2) + 1;
		int indexBoissonSansAlcool = Administration.selectionBoissonSansAlcool();
		int indexBoisson = -1;
		double prixTotal = 0;
		switch(random)
		{
			case 1:
				Administration.currentBar.getPatronne().offrirUnVerre();
				indexBoisson = rechercheBoissonPatronne();
				Administration.currentBar.getBarman().servirUnVerre(indexBoisson);
				Administration.currentBar.getBarman().servirUnVerre(indexBoissonSansAlcool);
				Administration.currentBar.getPatronne().boire(indexBoisson);
				Administration.currentBar.getBarman().boire();
				Administration.currentBar.getBarman().parler();
				break;
			case 2:
				Administration.currentBar.getBarman().offrirUnVerre();
				indexBoisson = rechercheBoissonPatronne();
				Administration.currentBar.getBarman().servirUnVerre(indexBoisson);
				prixTotal +=Administration.currentBar.mesBoissons.get(indexBoisson).getPrixVenteVerre();
				Administration.currentBar.getBarman().servirUnVerre(indexBoissonSansAlcool);
				prixTotal += Administration.currentBar.mesBoissons.get(indexBoissonSansAlcool).getPrixVenteVerre();
				Administration.currentBar.getBarman().payer(prixTotal);
				Administration.currentBar.getBarman().gestionDeLaCaisse(prixTotal);
				Administration.currentBar.getPatronne().boire(indexBoisson);
				Administration.currentBar.getBarman().boire();
				break;
		}	
		System.out.println("C'est la fin de la journée. A demain");
		ThreadGestion.tourBoucleJournee = 1;
		Administration.perteDalcoolemie();
		Main.afficherMenu();
	}
	
	public static void sansClient()
	{
		if(!Administration.currentBar.clientsBannis.isEmpty())
		{
			System.out.println("Tous les clients ont été bannis pour débordement. Nous n'avons pas le coeur à boire quelque chose.");
			ThreadGestion.tourBoucleJournee = 1;
			Administration.decrementation();
			Main.afficherMenu();
		}
		int indexBoisson = Administration.rechercheBoissonPatronne();
		int indexBoissonSansAlcool = Administration.selectionBoissonSansAlcool();
		int indexEau = Administration.rechercheIndexEau();
		Administration.currentBar.getPatronne().offrirUnVerre();
		
		Administration.currentBar.getBarman().servirUnVerre(indexBoisson);
		Administration.currentBar.getBarman().servirUnVerre(indexBoissonSansAlcool);
		for(int i=0; i<Administration.currentBar.serveur.size(); i++)
		{
			Administration.currentBar.getBarman().servirUnVerre(indexEau);
		}
		Administration.currentBar.getPatronne().boire(indexBoisson);
		Administration.currentBar.getBarman().boire();

		for(int i=0; i<Administration.currentBar.serveur.size(); i++)
		{
			Administration.currentBar.serveur.get(i).boireDeLeau();
		}
		Administration.decrementation();
		
		System.out.println("C'est la fin de la journée. A demain");
		ThreadGestion.tourBoucleJournee = 1;
		for(int i=0; i<Administration.currentBar.mesFournisseurs.size(); i++)
		{
			Administration.currentBar.mesFournisseurs.get(i).setTourBoucleEnCours(1);
			Administration.currentBar.mesFournisseurs.get(i).setTempsLivraison(Administration.currentBar.mesFournisseurs.get(i).getTempsLivraison() - 1);
			Administration.currentBar.mesFournisseurs.get(i).livraisonTerminee(i);
		}
		Administration.finBannissement();
		Administration.perteDalcoolemie();
		Main.afficherMenu();
	}
	
	/**
	 * Permet de gérer le bar lorsque il y a minimum 1 client
	 * @author Guillaume
	 */
	public static void avecClient()
	{
		while(true)
		{
		ThreadGestion gestionClient = new ThreadGestion();
		Random rnd = new Random();
		Integer aleatoireClient = new Integer(rnd.nextInt(Administration.currentBar.clients.size()));
		Integer aleatoireServeur = new Integer(rnd.nextInt(Administration.currentBar.serveur.size()));
		Integer indexBoissonClient = new Integer(Administration.rechercheBoissonClient(aleatoireClient));
		Integer doubleCommande = new Integer(1);
		Integer eventTournee = new Integer(rnd.nextInt(10));
		
		if (eventTournee == 9)
		{
			Administration.preparationTournee(aleatoireClient);
		}
		else
		{
			Administration.plusDeStocks(indexBoissonClient);	
		
				Administration.currentBar.clients.get(aleatoireClient).appelerServeur(aleatoireServeur, aleatoireClient);
				if(Administration.currentBar.clients.get(aleatoireClient).getDegreAlcoolemie() >= 0.75)
				{
					indexBoissonClient = Administration.currentBar.getPatronne().ordonner(aleatoireClient, aleatoireServeur);
				}
				Administration.gestionCommande(indexBoissonClient, aleatoireClient, aleatoireServeur);
				doubleCommande = Erreur.verificationSexeServeur(aleatoireServeur, aleatoireClient, indexBoissonClient);
				if(doubleCommande == 2)
				{
					indexBoissonClient = Administration.selectionBoissonAleatoire();
					Administration.gestionCommande(indexBoissonClient, aleatoireClient, aleatoireServeur);
				}
		}
			
				gestionClient.start();
				while (gestionClient.isAlive())
				{
					try
					{
						Thread.sleep(3000);
					}
					catch(InterruptedException e)
					{
					}
				}
		}	
	}
	
	/**
	 * Permet de selectionner aléatoirement une boisson sans alcool
	 * @author Guillaume
	 * @return index de la boisson non alcoolisée
	 */
	public static int selectionBoissonSansAlcool()
	{
		Random rnd = new Random();
		Integer indexBoissonSansAlcool = new Integer(rnd.nextInt(Main.repertoireBar.get(Main.indexBar).mesBoissons.size()));		
		while(Administration.currentBar.mesBoissons.get(indexBoissonSansAlcool).getDegreParVerre() != 0)
		{
			indexBoissonSansAlcool = rnd.nextInt(Administration.currentBar.mesBoissons.size());
		}	
		return indexBoissonSansAlcool;
	}
	
	/**
	 * Selectionne aléatoirement une boisson parmi toute celle existente
	 * @return
	 */
	public static int selectionBoissonAleatoire()
	{
		Random rnd = new Random();
		Integer indexBoisson =  new Integer(rnd.nextInt(Main.repertoireBar.get(Main.indexBar).mesBoissons.size()));
		return indexBoisson;
	}
	
	
	/**
	 * Permet de rechercher la position de la boisson favorite de la patronne dans la liste des boissons
	 * @author Guillaume
	 * @return la position de la boisson favorite de la patronne dans la liste des boissons
	 */
	public static int rechercheBoissonPatronne()
	{
		for (int indexBoisson = 0; indexBoisson<Administration.currentBar.mesBoissons.size(); indexBoisson++)
		{
			if(Administration.currentBar.mesBoissons.get(indexBoisson).getNomBoisson().equalsIgnoreCase(Administration.currentBar.getPatronne().getBoissonFavorite()))
			{
				Administration.currentBar.getBarman().servirUnVerre(indexBoisson);		    
				return indexBoisson;
			}
		}
		return 0;
	}

	/**
	 * Permet de rechercher la position de l'eau afin de pouvoir servir les serveurs
	 * @author Guillaume
	 * @return la position de l'eau dans la liste des boissons
	 */
	public static int rechercheIndexEau()
	{
		for (int indexEau=0; indexEau <Administration.currentBar.mesBoissons.size(); indexEau++)
		{
			if(Administration.currentBar.mesBoissons.get(indexEau).getNomBoisson().equalsIgnoreCase("Eau"))
			{	    
				return indexEau;
			}
		}
		return 0;
	}


/**
 * Permet de rechercher l'index de la boisson favorite d'un client OU de sa boisson favorite de secours
 * @return index de la boisson du client ou 0 par défault (eau)
 */
	public static int rechercheBoissonClient(int indexClient)
	{
		for (int indexBoissonClient=0; indexBoissonClient<Administration.currentBar.mesBoissons.size(); indexBoissonClient++)
		{
			if(Administration.currentBar.mesBoissons.get(indexBoissonClient).getNomBoisson().equalsIgnoreCase(Administration.currentBar.clients.get(indexClient).getBoissonFavorite()))
			{	    
				return indexBoissonClient;
			}
		}
		return 0;
	}
	
	/**
	 * Informe le client qu'il ne peut plus consommer de boisson alcolisée		
	 * @author Shehu
	 * @param indexClient
	 * @return index provenant de la méthode etre violent
	 */
	public static int refusDeServir(int indexClient, int indexServeur)
	{
		System.out.println("<" + Administration.currentBar.serveur.get(indexServeur).getPrenom() + "> Vous avez déjà trop bu. La patronne m'a demandé de ne plus vous servir.");
		Integer index = new Integer(Administration.currentBar.clients.get(indexClient).etreViolent(indexClient));
		return index;
	}
	
	/***
	 * Décrémente le nombre de jour de bannissement des clients à la fin des journée uniquement si les jours de bannissement sont supérieur à 0
	 * @author Guillaume
	 */
	public static void decrementation()
	{
		if(!Administration.currentBar.clientsBannis.isEmpty())
		{
			for(int i=0; i<Administration.currentBar.clientsBannis.size(); i++)
			{
				Administration.currentBar.clientsBannis.get(i).setJourBanissement(Administration.currentBar.clientsBannis.get(i).getJourBanissement() - 1);
			}
		}
	}
	
	/**
	 * Permet de gérer toute une commande
	 * @param indexBoissonClient
	 * @param aleatoireClient
	 * @param aleatoireServeur
	 * @param doubleCommande
	 */
	public static void gestionCommande( int indexBoissonClient, int aleatoireClient, int aleatoireServeur)
	{
		Double prixTotal = new Double(0);
		boolean peutPayer = true;

			Administration.currentBar.clients.get(aleatoireClient).commander(indexBoissonClient, aleatoireClient);
		if(Erreur.plusBoissonFavorite(indexBoissonClient))
		{
			System.out.println("<" + Administration.currentBar.serveur.get(aleatoireServeur).getPrenom() + "> Nous sommes désolé, nous n'avons plus de " + Administration.currentBar.mesBoissons.get(indexBoissonClient).getNomBoisson());
			System.out.println("<" + Administration.currentBar.serveur.get(aleatoireServeur).getPrenom() + "> Souhaitez-vous autre chose? ");
			indexBoissonClient = Administration.currentBar.clients.get(aleatoireClient).changerBoisson(aleatoireClient);
		}
		Administration.currentBar.serveur.get(aleatoireServeur).demanderAuBarman(indexBoissonClient, aleatoireServeur);
		Administration.currentBar.getBarman().servirUnVerre(indexBoissonClient);
		prixTotal += Administration.currentBar.serveur.get(aleatoireServeur).apporterBoisson(indexBoissonClient, aleatoireServeur);
		Administration.currentBar.serveur.get(aleatoireServeur).setCoteDePopularite(Administration.currentBar.serveur.get(aleatoireServeur).getCoteDePopularite() + 0.1);
		peutPayer = Administration.currentBar.clients.get(aleatoireClient).payer(prixTotal, aleatoireClient);
		if(!peutPayer)
		{
			if(Administration.currentBar.serveur.get(aleatoireServeur).getCoteDePopularite() > 50)
			{
				Administration.currentBar.clients.get(aleatoireClient).offrirUnPourboire(aleatoireServeur, aleatoireClient);
			}
			Administration.currentBar.clients.get(aleatoireClient).setCoteDePopularite(Administration.currentBar.clients.get(aleatoireClient).getCoteDePopularite() + 0.1);
			Administration.currentBar.clients.get(aleatoireClient).boire(indexBoissonClient);
			Administration.currentBar.getBarman().gestionDeLaCaisse(prixTotal);
		}
	}
	
	/**
	 * Permet à un client banni de rentrer de nouveau dans le bar une fois sa période de bannissement terminé
	 * @author Guillaume
	 */
	public static void finBannissement()
	{
		for( int i=0; i<Administration.currentBar.clientsBannis.size(); i++)
		{
			if(Administration.currentBar.clientsBannis.get(i).getJourBanissement() == 0)
			{
				System.out.println(Administration.currentBar.clientsBannis.get(i).getPrenom() + " est de nouveau autorisé à entrer " + Administration.currentBar.getNom());
				Administration.currentBar.clients.add(Administration.currentBar.clientsBannis.get(i));
				Administration.currentBar.clientsBannis.remove(i);
			}
		}
	}
	
	/**
	 * Permet de prévenir l'utilisateur que il manque une boisson et lui propose de passer une commande
	 * @author Guillaume
	 * @param indexBoissonClient
	 */
	public static void plusDeStocks(int indexBoissonClient)
	{
		if(Administration.currentBar.mesBoissons.get(indexBoissonClient).getStocks() == 0 )
		{
			if(Administration.commandePassee[indexBoissonClient][1].equalsIgnoreCase("non"))
			{
				System.out.println("Vous n'avez plus de réserve de: " + Administration.currentBar.mesBoissons.get(indexBoissonClient).getNomBoisson());
				System.out.println("Souhaitez-vous passer une commande? (O: Oui,   N:Non,   Q: Revenir au menu,   X: Exit ");
				Scanner in = new Scanner(System.in);
				String reponse = in.next();
				if(Erreur.choixCommande(reponse))
				{
					Administration.currentBar.getBarman().commander(indexBoissonClient);
					Administration.commandePassee[indexBoissonClient][1] = "oui";
				}
			}
		}
	}
	
	/**
	 * Fais perdre un peu d'alcool dans le sang aux clients, aux clients bannis et à la patronne
	 * @author Guillaume
	 */
	public static void perteDalcoolemie()
	{
		for (int i=0; i<Administration.currentBar.clients.size(); i++)
		{
			Administration.currentBar.clients.get(i).setDegreAlcoolemie(Administration.currentBar.clients.get(i).getDegreAlcoolemie() - 0.3);
			if(Administration.currentBar.clients.get(i).getDegreAlcoolemie() < 0)
			{
				Administration.currentBar.clients.get(i).setDegreAlcoolemie(0);
			}
		}
		
		for (int i=0; i<Administration.currentBar.clientsBannis.size(); i++)
		{
			Administration.currentBar.clientsBannis.get(i).setDegreAlcoolemie(Administration.currentBar.clientsBannis.get(i).getDegreAlcoolemie() - 0.3);
			if(Administration.currentBar.clientsBannis.get(i).getDegreAlcoolemie() < 0)
			{
				Administration.currentBar.clientsBannis.get(i).setDegreAlcoolemie(0);
			}
		}
		
		Administration.currentBar.getPatronne().setDegreAlcoolemie(Administration.currentBar.getPatronne().getDegreAlcoolemie() - 0.3);
		if(Administration.currentBar.getPatronne().getDegreAlcoolemie() < 0)
		{
			Administration.currentBar.getPatronne().setDegreAlcoolemie(0);
		}
	}
	
	/**
	 * Regarde la nature du client qui offre la tournée et appelle la méthode adhéquate suivant le genre du client
	 * @author Guillaume
	 * @param indexClient
	 */
	public static void preparationTournee(int indexClient)
	{
		if(Administration.currentBar.clients.get(indexClient).getClass().getName().equalsIgnoreCase("concoursbelote.ClientHomme"))
		{
			((ClientHomme)Administration.currentBar.clients.get(indexClient)).offrirUneTournee(indexClient);
		}
		else if(Administration.currentBar.clients.get(indexClient).getClass().getName().equalsIgnoreCase("concoursbelote.ClientFemme"))
		{
			((ClientFemme)Administration.currentBar.clients.get(indexClient)).offrirUneTournee(indexClient);
		}
	}
        
        public static void exitGestion (String reponse)
        {
            if(reponse.equalsIgnoreCase("Q"))
            {
                Main.afficherMenu();
            }
            else if (reponse.equalsIgnoreCase("X"))
            {
                System.exit(0);
            }
            else if (reponse.equalsIgnoreCase("O"))
            {}
            else
            {
                ThreadGestion.traitementChoixUser();
            }
        }
}
